package com.multiplayer.tools;

import java.util.HashMap;


import org.json.JSONArray;
import org.json.JSONObject;

import com.baidu.aip.face.AipFace;

/**
 * 
 * @author 张文豪 2020.5.11
 * 人脸识别Api工具类
 *  每个开发者账号可以创建100个appid；
 *  每个appid对应一个人脸库，且不同appid之间，人脸库互不相通；
 *	每个人脸库下，可以创建多个用户组，用户组（group）数量没有限制；
 *	每个用户组（group）下，可添加最多无限张人脸，无限个uid；
 *	每个用户（uid）所能注册的最大人脸数量没有限制；
 *
 */
public class FaceRecognition {
	//设置APPID/AK/SK
    public static final String APP_ID = "19762074";
    public static final String API_KEY = "flDr05XNjk92GSfySEL6ZfWz";
    public static final String SECRET_KEY = "2j8CIkLsqZjRAA9g4o9tIXjXxkpcZcAY";
    //得到人脸识别API的客户端对象
    private static AipFace client = new AipFace(APP_ID, API_KEY, SECRET_KEY);
    
    /**
     * 向某个用户组中添加人脸信息
     * @param image 取决于imageType参数，传入BASE64字符串或URL字符串或FACE_TOKEN字符串
     * @param imageType BASE64字符串或URL字符串或FACE_TOKEN字符串
     * @param groupId 用户组编号
     * @param userId  用户编号
     * @return true添加成功，false添加失败
     */
    public static boolean addFace(String image,String imageType,String groupId,String userId) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("user_info", "user's info");
        options.put("quality_control", "NORMAL");
        options.put("liveness_control", "LOW");
        options.put("action_type", "REPLACE");

        // 人脸注册
        JSONObject res = client.addUser(image, imageType, groupId, userId, options);
        String facetoken = res.getString("face_token");
        if(facetoken.equals("")) {
        	//如果注册后的facetoken为空添加失败
        	return false;
        }else {
        	//添加成功
        	return true;
        }
    }
    
    /**
     * 根据提供的人脸信息，在特定的用户组中搜索相似度超过80的人脸
     * @param image 取决于image_type参数，传入BASE64字符串或URL字符串或FACE_TOKEN字符串
     * @param imageType imageType BASE64字符串或URL字符串或FACE_TOKEN字符串
     * @param groupIdList 从指定的group中进行查找 用逗号分隔，上限20个
     */
    public static JSONObject searchFace(String image,String imageType,String groupIdList) {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("max_face_num", "3");
        //匹配的阈值即相似度
        options.put("match_threshold", "80");
        options.put("quality_control", "NORMAL");
        options.put("liveness_control", "LOW");
        options.put("max_user_num", "3");
 
        // 人脸搜索
        JSONObject res = client.search(image, imageType, groupIdList, options);
        
        System.out.println("人脸搜索："+res);
        String facetoken = res.getString("error_msg");
        System.out.println("error_msg:"+facetoken);
        if("SUCCESS".equals(facetoken)) {
        	//搜索成功
        	//人脸搜索：{"result":{"face_token":"cfdf1c2a4ecdb88790a0d9204e3af8df","user_list":[{"score":91.294509887695,"group_id":"User","user_id":"E001","user_info":""}]},"log_id":9975754510145,"error_msg":"SUCCESS","cached":0,"error_code":0,"timestamp":1589430381}
        	JSONObject groupname = res.getJSONObject("result").getJSONArray("user_list").getJSONObject(0);
        	System.out.println(groupname);
        	return groupname;
        }else {
        	//搜索失败
        	return null;
        }
    }
}
